package com.zgis.module.bas.util;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * 修改记录:
 * 24-09-29     zhengchaojun             首次创建
 */

/**
 * 类描述：Json工具类
 */
public class CxJson
{
    public static final ObjectMapper om = new ObjectMapper();

    /**
     * 创建一个ObjectNode实例，用于构建JSON对象结构。
     *
     * @return 返回一个新的ObjectNode实例。
     */
    public static ObjectNode objectNode()
    {
        return om.createObjectNode();
    }

    /**
     * 创建一个ArrayNode实例，用于构建JSON数组结构。
     *
     * @return 返回一个新的ArrayNode实例。
     */
    public static ArrayNode arrayNode()
    {
        return om.createArrayNode();
    }

    /**
     * 将给定的对象转换为JSON字符串。
     *
     * @param obj 需要转换的对象。
     * @return 返回对象的JSON字符串表示。
     * @throws JsonProcessingException 如果对象无法转换为JSON字符串时抛出。
     */
    public static String toString(Object obj) throws JsonProcessingException
    {
        return om.writeValueAsString(obj);
    }

    /**
     * 从给定的ObjectNode中提取键值对，并存储到Map中。
     *
     * @param jo 包含键值对的ObjectNode。
     * @return 返回一个包含所有键值对的Map，键和值都是字符串类型。
     */
    public static Map<String, String> getMapFromJson(ObjectNode jo)
    {
        Map<String, String> ret   = new HashMap();
        Iterator<String>    names = jo.fieldNames();

        while (names.hasNext())
        {
            String key = (String) names.next();
            ret.put(key, jo.get(key).asText());
        }

        return ret;
    }

    /**
     * 将实体列表转换为Map列表的通用方法。
     *
     * @param list 实体对象的列表
     * @return     返回一个Map列表，其中每个Map代表一个实体对象，键是实体的字段名，值是字段对应的值
     */
    public static List<Map<String, Object>> toListMap(List list)
    {
        return  om.convertValue(list, new TypeReference<List<Map<String, Object>>>()
        {
        });
    }
}